// 一、引入axios
import axios from 'axios'
import store from '@/store/index.js'
import JSONbig from 'json-bigint' // 处理大数
import router from '@/router'

// 二、配置axios
const http = axios.create({
  // 2.1 基地址
  baseURL: 'http://toutiao-app.itheima.net',
  // 2.2 大数处理
  transformResponse: [
    function(data) {
      // data => 原始的后台返回的 json 字符串数据
      // 这里的方法, 会覆盖axios默认对于返回结果的处理, 默认进行的是 JSON.parse
      // 需要进行的是 JSONbig.parse

      // 后台返回的有可能不是 json字符串, JSONbig 解析就会报错, 不合理的, 需要处理
      try {
        return JSONbig.parse(data)
      } catch (err) {
        // 如果解析不了, 说明不是json格式, 原样输出
        return data
      }
    },
  ],
})

// 三、添加请求拦截器
http.interceptors.request.use(
  function(config) {
    // 在发送请求之前做些什么
    // console.log(store)
    const token = store.state.user.tokenInfo.token
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  function(error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 四、添加响应拦截器
http.interceptors.response.use(
  function(response) {
    // 对响应数据做点什么
    return response
  },
  async function(error) {
    // 对响应错误做点什么
    // console.log(error.response)
    if (error.response.status === 401) {
      // console.log(401)
      // console.log(error.config)
      // (1)说明token过期了,需要通过 refresh_token 去刷新token
      const refreshToken = store.state.user.tokenInfo.refresh_token
      if (refreshToken) {
        try {
          // console.log('存在refreshToken, 需要进行刷新token操作')
          const { data } = await axios({
            method: 'put',
            url: 'http://toutiao-app.itheima.net/v1_0/authorizations',
            // 请求头中携带refresh_token信息
            headers: { Authorization: `Bearer ${refreshToken}` },
          })
          // (2) 提交设置tokenInfo的mutations
          store.commit('user/setTokenInfo', {
            token: data.data.token,
            refresh_token: refreshToken,
          })
          // (3) 重新发送请求,不需要用户手动刷新
          return http(error.config)
        } catch {
          // console.log('使用refresh_token获取新token失败')
          // 清除本地token跳转路由
          store.commit('user/removeTokenInfo')
          // 路由跳转, 进入登录页
          router.push({
            path: '/login',
            query: {
              backto: router.currentRoute.fullPath,
            },
          })
        }
      } else {
        // 没有refreshToken, 直接去登录, 将来还能跳回来
        // router.currentRoute 指向当前路由信息对象 === 等价于之前页面中用的 this.$route
        // 清除本地token, 跳转登录 (无意义的本地token内容, 要清除)
        store.commit('user/removeTokenInfo')
        router.push({
          path: '/login',
          query: {
            backto: router.currentRoute.fullPath,
          },
        })
      }
    }
    return Promise.reject(error)
  }
)

// 导出axios
export default http
